package com.capgemini.cn.authority.rest.service;

import com.capgemini.cn.authority.rest.exception.AuthRestBusinessException;
import com.capgemini.cn.authority.rest.valueobject.DataResponse;
import org.springframework.data.domain.Sort;

import java.util.List;
import java.util.Map;

/**
 * <p>公共服务类，用以定义一些常用的公共业务服务函数</p>
 * Created at 2017/9/15
 *
 * @param <D> 需要返回给客户端的值对象类型
 * @author Andriy
 */
public interface CommonService<D> {

    /**
     * 根据ID查询单个数据实体对象{@link D}
     *
     * @param id 数据ID主键值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<D> findById(long id);

    /**
     * 分页查询所有数据并按照指定规则排序
     *
     * @param page      查询的页码数，默认为0（即从第一页开始查询）
     * @param size      每页数据的条数，如果值为-1或0则表示查询所有的数据（即最大条数，此时分页参数失效）
     * @param orderProp 排序属性名称
     * @param direction 排序规则
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<List<D>> findAll(int page, int size, String orderProp, Sort.Direction direction);

    /**
     * 添加一个实体对象
     *
     * @param source 需要添加的实体对象数据
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<D> add(D source);

    /**
     * 批量添加实体对象{@link D}
     *
     * @param sourceList 需要添加的实体对象数据集合
     * @return 返回true表示批量添加成功，反之则表示失败
     */
    boolean add(List<D> sourceList);

    /**
     * 更新指定属性值
     *
     * @param id         数据ID主键值
     * @param properties 需要更新的属性列表，key为字符串类型用以标识需要更新的属性名称，value为对象类型用以存放更新后的数据值
     * @return 包装成{@link DataResponse}对象返回对应的实体对象数据
     */
    DataResponse<D> update(long id, Map<String, Object> properties) throws AuthRestBusinessException;

    /**
     * 批量更新指定属性值（需要更新的属性可以是一个关联的实体对象）
     *
     * @param properties 需要更新的属性列表，key为字符串类型用以标识需要更新的属性名称，value为对象类型用以存放更新后的数据值
     * @param sourceList 需要更新的实体对象数据列表
     * @return 返回true表示批量更新成功，反之则表示失败
     */
    boolean update(Map<String, Object> properties, List<D> sourceList);

    /**
     * 根据ID删除单个数据实体对象
     *
     * @param id 数据ID值
     * @return 返回true表示批量删除成功，反之则表示失败
     */
    boolean delete(long id) throws AuthRestBusinessException;

    /**
     * 根据ID批量删除数据实体对象
     *
     * @param ids 数据ID值集合
     * @return 返回true表示批量删除成功，反之则表示失败
     */
    boolean delete(List<Long> ids);
}
